home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / settings.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-10  |  10.7 KB  |  373 lines  |  [TEXT/CWIE]

  1. #include "gltron.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define BUFSIZE 100
  7. #define MAX_VAR_NAME_LEN 64
  8.  
  9.  
  10. void settings_key_actions(char *buf, FILE *f) {
  11.   int i, tmp[8];
  12.   if(f != NULL) {
  13.     fprintf(f, "vset keys ");
  14.     for(i = 0; i < 8; i++)
  15.       fprintf(f, "%d ", key_actions[i].key);
  16.     fprintf(f, "\n");
  17.   } else {
  18.     sscanf(buf, "vset keys %d %d %d %d %d %d %d %d ", 
  19.        tmp + 0, tmp + 1, tmp + 2, tmp + 3, tmp + 4,
  20.        tmp + 5, tmp + 6, tmp + 7);
  21.     for(i = 0; i < 8; i++)
  22.       key_actions[i].key = tmp[i];
  23.   }
  24. }
  25.  
  26. void settings_cycle_colors(char *buf, FILE *f) {
  27.   int i, t;
  28.   float tmp[4];
  29.   if(f != NULL) {
  30.     for(i = 0; i < MAX_PLAYERS; i++)
  31.       fprintf(f, "vset cycle_colors %d %.3f %.3f %.3f %.3f\n", i,
  32.           colors_model[i][0],
  33.           colors_model[i][1],
  34.           colors_model[i][2],
  35.           colors_model[i][3]);
  36.   } else {
  37.     sscanf(buf, "vset cycle_colors %d %f %f %f %f ", &t,
  38.        tmp + 0, tmp + 1, tmp + 2, tmp + 3);
  39.     if(t < MAX_PLAYERS)
  40.       memcpy(colors_model[t], tmp, sizeof(tmp));
  41.     else
  42.       fprintf(stderr, "error reading colors: unknown player %d\n", t);
  43.   }
  44. }
  45.  
  46. void settings_trail_colors(char *buf, FILE *f) {
  47.   int i, t;
  48.   float tmp[4];
  49.   if(f != NULL) {
  50.     for(i = 0; i < MAX_PLAYERS; i++)
  51.       fprintf(f, "vset trail_colors %d %.3f %.3f %.3f %.3f\n", i,
  52.           colors_alpha[i][0],
  53.           colors_alpha[i][1],
  54.           colors_alpha[i][2],
  55.           colors_alpha[i][3]);
  56.   } else {
  57.     sscanf(buf, "vset trail_colors %d %f %f %f %f ", &t,
  58.        tmp + 0, tmp + 1, tmp + 2, tmp + 3);
  59.     if(t < MAX_PLAYERS)
  60.       memcpy(colors_alpha[t], tmp, sizeof(tmp));
  61.     else
  62.       fprintf(stderr, "error reading colors: unknown player %d\n", t);
  63.   }
  64. }
  65.  
  66. void initSettingData(char *filename) {
  67.   FILE *f;
  68.   int n, i, count, j;
  69.   char buf[BUFSIZE];
  70.   char c;
  71.  
  72.   f = fopen(filename, "r");
  73.   fgets(buf, BUFSIZE, f);
  74.   sscanf(buf, "%d ", &n);
  75.   for(i = 0; i < n; i++) {
  76.     fgets(buf, BUFSIZE, f);
  77.     sscanf(buf, "%c%d ", &c, &count);
  78.     switch(c) {
  79.     case 'i': /* it's int */
  80.       si = malloc(sizeof(struct settings_int) * count);
  81.       si_count = count;
  82.       for(j = 0; j < count; j++) {
  83.     fgets(buf, BUFSIZE, f);
  84.     buf[MAX_VAR_NAME_LEN - 1] = 0;
  85.     sscanf(buf, "%s ", (si + j)->name);
  86.       }
  87.       break;
  88.     case 'f': /* float */
  89.       sf = malloc(sizeof(struct settings_float) * count);
  90.       sf_count = count;
  91.       for(j = 0; j < count; j++) {
  92.     fgets(buf, BUFSIZE, f);
  93.     buf[MAX_VAR_NAME_LEN - 1] = 0;
  94.     sscanf(buf, "%s ", (sf + j)->name);
  95.       }
  96.       break;
  97.     case 'v': /* void */
  98.       sv = malloc(sizeof(struct settings_v) * count);
  99.       sv_count = count;
  100.       for(j = 0; j < count; j++) {
  101.     fgets(buf, BUFSIZE, f);
  102.     buf[MAX_VAR_NAME_LEN - 1] = 0;
  103.     sscanf(buf, "%s ", (sv + j)->name);
  104.       }
  105.       break;
  106.     default:
  107.       printf("unrecognized type '%c' in settings.txt\n", c);
  108.       exit(1);
  109.     }
  110.   }
  111.   fclose(f);
  112.  
  113.   si[0].value = &(game->settings->show_help);
  114.   si[1].value = &(game->settings->show_fps);
  115.   si[2].value = &(game->settings->show_wall);
  116.   si[3].value = &(game->settings->show_glow);
  117.   si[4].value = &(game->settings->show_2d);
  118.   si[5].value = &(game->settings->show_alpha);
  119.   si[6].value = &(game->settings->show_floor_texture);
  120.   si[7].value = &(game->settings->line_spacing);
  121.   si[8].value = &(game->settings->erase_crashed);
  122.   si[9].value = &(game->settings->fast_finish);
  123.   si[10].value = &(game->settings->fov);
  124.   si[11].value = &(game->settings->width);
  125.   si[12].value = &(game->settings->height);
  126.   si[13].value = &(game->settings->show_ai_status);
  127.   si[14].value = &(game->settings->camType);
  128.   si[15].value = &(game->settings->display_type);
  129.   si[16].value = &(game->settings->playMusic);
  130.   si[17].value = &(game->settings->show_model);
  131.   si[18].value = &(game->settings->ai_player1);
  132.   si[19].value = &(game->settings->ai_player2);
  133.   si[20].value = &(game->settings->ai_player3);
  134.   si[21].value = &(game->settings->ai_player4);
  135.   si[22].value = &(game->settings->show_crash_texture);
  136.   si[23].value = &(game->settings->turn_cycle);
  137.   si[24].value = &(game->settings->mouse_warp);
  138.   si[25].value = &(game->settings->windowMode);
  139.   si[26].value = &(game->settings->model_backwards);
  140.   si[27].value = &(game->settings->grid_size);
  141.   si[28].value = &(game->settings->playEffects);
  142.   si[29].value = &(game->settings->use_mipmaps);
  143.   si[30].value = &(game->settings->game_speed);
  144.   si[31].value = &(game->settings->arena_size);
  145.   si[32].value = &(game->settings->alpha_trails);
  146.   si[33].value = &(game->settings->lod);
  147.   si[34].value = &(game->settings->ai_level);
  148.   si[35].value = &(game->settings->mipmap_filter);
  149.   si[36].value = &(game->settings->stretch_textures);
  150.   si[37].value = &(game->settings->show_skybox);
  151.  
  152.   sf[0].value = &(game->settings->current_speed);
  153.   sf[1].value = &(game->settings->musicVolume);
  154.   sf[2].value = &(game->settings->fxVolume);
  155.  
  156.   sv[0].value = settings_key_actions;
  157.   sv[1].value = settings_cycle_colors;
  158.   sv[2].value = settings_trail_colors;
  159. }
  160.  
  161. int* getVi(char* name) {
  162.   int i;
  163.   for(i = 0; i < si_count; i++) {
  164.     if(strstr(name, si[i].name) == name) 
  165.       return si[i].value;
  166.   }
  167.   return NULL;
  168. }
  169.  
  170. /*
  171. void* getVv(char *name) {
  172.   int i;
  173.   for(i = 0; i < sv_count; i++) {
  174.     if(strstr(name, sv[i].name) == name)
  175.       return sv[i].value;
  176.   }
  177.   return NULL;
  178. }
  179. */
  180.  
  181. float* getVf(char* name) {
  182.   int i;
  183.   for(i = 0; i < sf_count; i++) {
  184.     if(strstr(name, sf[i].name) == name) 
  185.       return sf[i].value;
  186.   }
  187.   return NULL;
  188. }
  189.  
  190. void initMainGameSettings(char *filename) {
  191.   char *fname;
  192.   char *home;
  193.   char buf[100];
  194.   char expbuf[100];
  195.   int i;
  196.   FILE* f;
  197.  
  198.   game2 = &main_game2;
  199.   game = &main_game;
  200.   game->settings = (Settings*) malloc(sizeof(Settings));
  201.   initSettingData(filename);
  202.  
  203.   /* initialize defaults, then load modifications from file */
  204.  
  205.   game->pauseflag = 0;
  206.  
  207.   game->settings->show_help = 0;
  208.   game->settings->show_fps = 1;
  209.   game->settings->show_wall = 1;
  210.   game->settings->show_glow = 1;
  211.   game->settings->show_2d = 0;
  212.   game->settings->show_alpha = 1;
  213.   game->settings->light_cycles = 1;
  214.   game->settings->alpha_trails = 0;
  215.   game->settings->show_skybox = 0;
  216.   game->settings->show_floor_texture = 1;
  217.   game->settings->show_crash_texture = 1;
  218.   game->settings->show_model = 1;
  219.   game->settings->lod = 0;
  220.   game->settings->turn_cycle = 1;
  221.   game->settings->line_spacing = 20;
  222.   game->settings->erase_crashed = 0;
  223.   game->settings->fast_finish = 1;
  224.   game->settings->fov = 105;
  225.   game->settings->znear = 1.0;
  226.   game->settings->current_speed = 7.0;
  227.   game->settings->game_speed = 1; /* normal */
  228.   /* game->settings->grid_size MUST be divisible by 8 */
  229.   game->settings->arena_size = 1;
  230.   game->settings->grid_size = 240;
  231.   game->settings->width = 640;
  232.   game->settings->height = 480;
  233.   game->settings->show_ai_status = 1;
  234.   game->settings->camType = 0;
  235.   game->settings->mouse_warp = 0;
  236.   game->settings->windowMode = 0;
  237.   game->settings->model_backwards = 0;
  238.   game->settings->use_mipmaps = 1;
  239.   game->settings->mipmap_filter = TRILINEAR;
  240.   game->settings->stretch_textures = 0;
  241.   game->settings->softwareRendering = 0;
  242.  
  243.   game->settings->display_type = 0;
  244.   game->settings->playMusic = 1;
  245.   game->settings->playEffects = 1;
  246.  
  247.   game->settings->musicVolume = 0.5;
  248.   game->settings->fxVolume = 0.5;
  249.  
  250.   game->settings->ai_player1 = 0;
  251.   game->settings->ai_player2 = 1;
  252.   game->settings->ai_player3 = 1;
  253.   game->settings->ai_player4 = 1;
  254.  
  255.   game->settings->ai_level = 2;
  256.   
  257.   /* not included in .gltronrc */
  258.  
  259.   game->settings->screenSaver = 0;
  260.  
  261.   game->settings->content[0] = 0;
  262.   game->settings->content[1] = 1;
  263.   game->settings->content[2] = 2;
  264.   game->settings->content[3] = 3;
  265.  
  266.   /* go for .gltronrc (or whatever is defined in RC_NAME) */
  267.  
  268.   home = getenv("HOME"); /* find homedir */
  269.   if(home == NULL) {
  270.     fname = malloc(strlen(CURRENT_DIR) + strlen(RC_NAME) + 2);
  271.     sprintf(fname, "%s%c%s", CURRENT_DIR, SEPERATOR, RC_NAME);
  272.   } else {
  273.     fname = malloc(strlen(home) + strlen(RC_NAME) + 2);
  274.     sprintf(fname, "%s%c%s", home, SEPERATOR, RC_NAME);
  275.   }
  276.   f = fopen(fname, "r");
  277.   if(f == NULL)
  278.     printf("no %s found - using defaults\n", fname);
  279.   else {
  280.     while(fgets(buf, sizeof(buf), f)) {
  281.       /* process rc-file */
  282.  
  283.       if(strstr(buf, "iset") == buf) {
  284.     /* linear search through settings */
  285.     /* first: integer */
  286.     for(i = 0; i < si_count; i++) {
  287.       sprintf(expbuf, "iset %s ", si[i].name);
  288.       if(strstr(buf, expbuf) == buf) {
  289.         sscanf(buf + strlen(expbuf), "%d ", si[i].value);
  290.         /* printf("assignment: %s\t%d\n", si[i].name, *(si[i].value)); */
  291.         break;
  292.       }
  293.     }
  294.       } else if(strstr(buf, "fset") == buf) {
  295.     for(i = 0; i < sf_count; i++) {
  296.       sprintf(expbuf, "fset %s ", sf[i].name);
  297.       if(strstr(buf, expbuf) == buf) {
  298.         sscanf(buf + strlen(expbuf), "%f ", sf[i].value);
  299.         /* printf("assignment: %s\t%.2f\n", sf[i].name, *(sf[i].value)); */
  300.         break;
  301.       }
  302.     }
  303.       } else if(strstr(buf, "vset") == buf) {
  304.     for(i = 0; i < sv_count; i++) {
  305.       sprintf(expbuf, "vset %s ", sv[i].name);
  306.       if(strstr(buf, expbuf) == buf)
  307.         sv[i].value(buf, NULL);
  308.     }
  309.       }
  310.     }
  311.     free(fname);
  312.     fclose(f);
  313.   }
  314.  
  315.   game->settings->grid_size = default_arena_sizes[game->settings->arena_size];
  316.  
  317.   /* sanity check: speed, grid_size */
  318.   if(game->settings->current_speed <= 0) {
  319.     fprintf(stderr, "[gltron] sanity check failed: speed = %.2ff\n",
  320.         game->settings->current_speed);
  321.     game->settings->current_speed = 6.0;
  322.     fprintf(stderr, "[gltron] reset speed: speed = %.2f\n",
  323.         game->settings->current_speed);
  324.   }
  325.   if(game->settings->grid_size % 8) {
  326.     fprintf(stderr, "[gltron] sanity check failed: grid_size %% 8 != 0: "
  327.         "grid_size = %d\n", game->settings->grid_size);
  328.     game->settings->grid_size = 240;
  329.     fprintf(stderr, "[gltron] reset grid_size: grid_size = %d\n",
  330.         game->settings->grid_size);
  331.   }
  332.  
  333.   /* choose speed */
  334.   default_speeds[4] = game->settings->current_speed;
  335.   game->settings->current_speed = default_speeds[ game->settings->game_speed ];
  336.   printf("[gltron] speed set to %.2f (level %d)\n",
  337.      game->settings->current_speed, game->settings->game_speed);
  338.  
  339. }
  340.  
  341. void saveSettings() {
  342.   char *fname;
  343.   char *home;
  344.   int i;
  345.   FILE* f;
  346.  
  347.   home = getenv("HOME"); /* find homedir */
  348.   if(home == NULL) {
  349.     fname = malloc(strlen(CURRENT_DIR) + strlen(RC_NAME) + 2);
  350.     sprintf(fname, "%s%c%s", CURRENT_DIR, SEPERATOR, RC_NAME);
  351.   } else {
  352.     fname = malloc(strlen(home) + strlen(RC_NAME) + 2);
  353.     sprintf(fname, "%s%c%s", home, SEPERATOR, RC_NAME);
  354.   }
  355.   f = fopen(fname, "w");
  356.   if(f == NULL) {
  357.     printf("can't open %s ", fname);
  358.     perror("for writing");
  359.     return; /* can't write rc */
  360.   }
  361.   for(i = 0; i < si_count; i++)
  362.     fprintf(f, "iset %s %d\n", si[i].name, *(si[i].value));
  363.   for(i = 0; i < sf_count; i++)
  364.     fprintf(f, "fset %s %.2f\n", sf[i].name, *(sf[i].value));
  365.   for(i = 0; i < sv_count; i++) {
  366.     (sv[i].value)(NULL, f);
  367.   }
  368.   printf("written settings to %s\n", fname);
  369.   free(fname);
  370.   fclose(f);
  371. }
  372.  
  373.